字符串处理——算法系列教程(c++版)

梦想不会自己发光,真正闪耀的是那个为梦狂奔的你。献给知行的孩子们!(Eric.He著)


  对字符串进行拼接、匹配、编码等操作,目标是最小化拼接代价、最大化匹配效率,每一步选择当前最优的字符串操作策略。

  本教程以多个字符串处理贪心算法案例场景为例,让大家彻底理解以 “局部最优” 推导 “全局最优” 的核心逻辑,并掌握最优字符串拼接、贪心匹配算法的原理及代码实现。

  1. 最优字符串拼接:给定多个字符串,拼接成一个总字符串,最小化拼接时的总代价(如拼接两个长度为 m、n 的字符串代价为 m+n),策略是每次选择长度最短的两个字符串拼接(与哈夫曼树思想一致)。实际场景:大数据文件的合并(最小化磁盘 IO 次数)、字符串数组的拼接优化。
  2. 贪心匹配算法:在字符串匹配中(如 KMP 的简化版、正则表达式的简单匹配),按从左到右优先匹配最长 / 最短子串的策略,快速完成匹配。实际场景:文本检索的关键词匹配、编辑器的查找替换功能。

教程目录导航

一、最优字符串拼接

问题描述:

示例:

算法解析:


#include <iostream>
using namespace std;

char* largestMerge(char * word1, char * word2) {
    int m = strlen(word1), n = strlen(word2);
    char *merge = (char *)malloc(sizeof(char) * (m + n + 1));
    int i = 0, j = 0, pos = 0;
    while (i < m || j < n) {
        if (i < m && strcmp(word1 + i, word2 + j) > 0) {
            merge[pos] = word1[i];
            pos++, i++;
        } else {
            merge[pos] = word2[j];
            pos++, j++;
        }
    }
    merge[pos] = '\0';
    return merge;
}

int main() {
    char* word1="cabaa";
    char* word2="bcaaa";

    cout << "word1=" << word1 << endl;
    cout << "word2=" << word2 << endl;
    cout << "merge=" << largestMerge(word1, word2);

    return 0;
} 
        

输出结果


word1=cabaa
word2=bcaaa
merge=cbcabaaaaa
                    

二、贪心匹配算法

问题描述:

示例1:

示例2:

示例2:

算法解析:

为了得到最晚有效时间,我们可以从高位向低位枚举,在保证时间有效的情况下,使得每一位尽可能取最大值。


#include <iostream>

using namespace std;

char* maximumTime(char* time) {
    if (time[0] == '?') {
        time[0] = ('4' <= time[1] && time[1] <= '9') ? '1' : '2';
    }
    if (time[1] == '?') {
        time[1] = (time[0] == '2') ? '3' : '9';
    }
    if (time[3] == '?') {
        time[3] = '5';
    }
    if (time[4] == '?') {
        time[4] = '9';
    }
    return time;
}

int main() {
    char time[] ="2?:?0";
    cout << "time=" << time << endl;

    cout << "max time=" << maximumTime(time);
    return 0;
}
        

输出结果


time=2?:?0
max time=23:50
            

返回顶部